/**
 * 订单服务类
 * 业务层级：业务逻辑层
 * 功能说明：为订单管理提供完整的业务逻辑实现，包括订单创建、支付、取消、退款等核心流程
 * 架构关系：遵循四层架构设计，负责协调数据访问层和表现层交互，处理订单相关的复杂业务规则
 */
#ifndef ORDERSERVICE_H
#define ORDERSERVICE_H

#include <QObject>
#include <QVector>
#include <QMap>
#include <QVariant>
#include "order.h"

// 前置声明，减少编译依赖
class ShoppingCart;
class OrderDAO;
class ProductDAO;
class InventoryDAO;

class OrderService : public QObject
{
    Q_OBJECT

public:
    explicit OrderService(QObject *parent = nullptr);

    // 设置依赖的DAO对象
    void setOrderDAO(OrderDAO *orderDAO);
    void setProductDAO(ProductDAO *productDAO);
    void setInventoryDAO(InventoryDAO *inventoryDAO);

    // 创建订单（从购物车）
    int createOrderFromCart(const ShoppingCart &cart, int userId, int customerId = 0,
                           PaymentMethod paymentMethod = PAYMENT_CASH);

    // 支付订单
    bool payOrder(int orderId, PaymentMethod paymentMethod, const QString &transactionNo = "");

    // 取消订单
    bool cancelOrder(int orderId, const QString &reason = "");

    // 完成订单（交付商品）
    bool completeOrder(int orderId);

    // 退款处理
    bool refundOrder(int orderId, const QString &reason = "");

    // 获取订单详情
    Order getOrderDetails(int orderId);

    // 获取用户的所有订单
    QVector<Order> getUserOrders(int userId);

    // 获取会员的所有订单
    QVector<Order> getCustomerOrders(int customerId);

    // 获取日期范围内的订单
    QVector<Order> getOrdersByDateRange(const QDateTime &startDate, const QDateTime &endDate);

    // 获取今日订单统计
    QMap<QString, QVariant> getTodayOrderStats();

    // 获取销售统计
    QMap<QString, QVariant> getSalesStats(const QDateTime &startDate, const QDateTime &endDate);

    // 生成订单号（格式：年月日+序列号，如202509100001）
    QString generateOrderNumber();

    // 验证订单是否可以支付
    bool canOrderBePaid(int orderId);

    // 验证订单是否可以取消
    bool canOrderBeCancelled(int orderId);

    // 验证订单是否可以退款
    bool canOrderBeRefunded(int orderId);

    explicit OrderService(OrderDAO *orderDAO, ProductDAO *productDAO);

    // 创建订单（包含统计更新）
    bool createOrder(const Order &order);

signals:
    // 订单状态变化信号
    void orderCreated(int orderId);
    void orderPaid(int orderId);
    void orderCancelled(int orderId);
    void orderCompleted(int orderId);
    void orderRefunded(int orderId);

    // 错误信号
    void errorOccurred(const QString &errorMessage);

private:
    OrderDAO *m_orderDAO;
    ProductDAO *m_productDAO;
    InventoryDAO *m_inventoryDAO;

    // 更新库存（减少库存）
    bool updateInventoryForOrder(const Order &order);

    // 恢复库存（取消订单或退款时）
    bool restoreInventoryForOrder(const Order &order);

    // 验证库存是否足够
    bool validateInventory(const Order &order);

    // 更新销售统计
     bool updateSalesStatistics(const Order &order);

     // 更新库存
     bool updateInventory(const Order &order);
};

#endif // ORDERSERVICE_H
